{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "c49523cd",
   "metadata": {},
   "source": [
    "# KNN实验（MNIST & CIFAR-10）\n",
    "\n",
    "本实验将使用K近邻（KNN）模型对MNIST和CIFAR-10数据集进行分类任务，分析其表现并进行可视化。"
   ]
  },
  {
   "cell_type": "code",
   "id": "d586f68a",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-22T14:40:28.984711Z",
     "start_time": "2025-05-22T14:40:19.534536Z"
    }
   },
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.metrics import accuracy_score, confusion_matrix\n",
    "import torchvision\n",
    "import torchvision.transforms as transforms"
   ],
   "outputs": [],
   "execution_count": 1
  },
  {
   "cell_type": "markdown",
   "id": "3ba15e06",
   "metadata": {},
   "source": [
    "## 加载数据集"
   ]
  },
  {
   "cell_type": "code",
   "id": "fb7a5bd1",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-22T14:40:30.380692Z",
     "start_time": "2025-05-22T14:40:28.988725Z"
    }
   },
   "source": [
    "def load_mnist():\n",
    "    transform = transforms.Compose([\n",
    "        transforms.ToTensor(),\n",
    "        transforms.Normalize((0.5,), (0.5,))\n",
    "    ])\n",
    "    trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=transform)\n",
    "    testset = torchvision.datasets.MNIST(root='./data', train=False, download=True, transform=transform)\n",
    "    return trainset, testset\n",
    "\n",
    "def load_cifar10():\n",
    "    transform = transforms.Compose([\n",
    "        transforms.ToTensor(),\n",
    "        transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))\n",
    "    ])\n",
    "    trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)\n",
    "    testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)\n",
    "    return trainset, testset\n",
    "\n",
    "def dataset_to_numpy(dataset, flatten=True):\n",
    "    X = []\n",
    "    y = []\n",
    "    for img, label in dataset:\n",
    "        arr = img.numpy()\n",
    "        if flatten:\n",
    "            arr = arr.flatten()\n",
    "        else:\n",
    "            arr = arr.transpose(1, 2, 0)\n",
    "        X.append(arr)\n",
    "        y.append(label)\n",
    "    X = np.array(X)\n",
    "    y = np.array(y)\n",
    "    return X, y\n",
    "\n",
    "mnist_train, mnist_test = load_mnist()\n",
    "cifar_train, cifar_test = load_cifar10()\n",
    "print(f\"MNIST训练集样本数: {len(mnist_train)}，测试集样本数: {len(mnist_test)}\")\n",
    "print(f\"CIFAR-10训练集样本数: {len(cifar_train)}，测试集样本数: {len(cifar_test)}\")"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MNIST训练集样本数: 60000，测试集样本数: 10000\n",
      "CIFAR-10训练集样本数: 50000，测试集样本数: 10000\n"
     ]
    }
   ],
   "execution_count": 2
  },
  {
   "cell_type": "markdown",
   "id": "b688ee88",
   "metadata": {},
   "source": [
    "## 数据预处理"
   ]
  },
  {
   "cell_type": "code",
   "id": "bddefa63",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-22T14:40:41.508542Z",
     "start_time": "2025-05-22T14:40:30.490580Z"
    }
   },
   "source": [
    "# MNIST\n",
    "X_train_m, y_train_m = dataset_to_numpy(mnist_train)\n",
    "X_test_m, y_test_m = dataset_to_numpy(mnist_test)\n",
    "# CIFAR-10\n",
    "X_train_c, y_train_c = dataset_to_numpy(cifar_train)\n",
    "X_test_c, y_test_c = dataset_to_numpy(cifar_test)\n",
    "# 只取部分样本\n",
    "n_samples = 2000  # KNN较慢，减少样本数\n",
    "X_train_m, y_train_m = X_train_m[:n_samples], y_train_m[:n_samples]\n",
    "X_test_m, y_test_m = X_test_m[:500], y_test_m[:500]\n",
    "X_train_c, y_train_c = X_train_c[:n_samples], y_train_c[:n_samples]\n",
    "X_test_c, y_test_c = X_test_c[:500], y_test_c[:500]\n",
    "# 标准化\n",
    "scaler_m = StandardScaler().fit(X_train_m)\n",
    "X_train_m = scaler_m.transform(X_train_m)\n",
    "X_test_m = scaler_m.transform(X_test_m)\n",
    "scaler_c = StandardScaler().fit(X_train_c)\n",
    "X_train_c = scaler_c.transform(X_train_c)\n",
    "X_test_c = scaler_c.transform(X_test_c)"
   ],
   "outputs": [],
   "execution_count": 3
  },
  {
   "cell_type": "markdown",
   "id": "331f503a",
   "metadata": {},
   "source": [
    "## KNN模型训练与评估"
   ]
  },
  {
   "cell_type": "code",
   "id": "47322f47",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-22T14:40:43.260301Z",
     "start_time": "2025-05-22T14:40:41.519974Z"
    }
   },
   "source": [
    "def train_and_evaluate(model, X_train, y_train, X_test, y_test):\n",
    "    model.fit(X_train, y_train)\n",
    "    y_pred = model.predict(X_test)\n",
    "    acc = accuracy_score(y_test, y_pred)\n",
    "    cm = confusion_matrix(y_test, y_pred)\n",
    "    return acc, cm, y_pred\n",
    "\n",
    "# MNIST\n",
    "knn_mnist = KNeighborsClassifier()\n",
    "acc_m, cm_m, y_pred_m = train_and_evaluate(knn_mnist, X_train_m, y_train_m, X_test_m, y_test_m)\n",
    "print(f\"MNIST KNN准确率: {acc_m:.3f}\")\n",
    "# CIFAR-10\n",
    "knn_cifar = KNeighborsClassifier()\n",
    "acc_c, cm_c, y_pred_c = train_and_evaluate(knn_cifar, X_train_c, y_train_c, X_test_c, y_test_c)\n",
    "print(f\"CIFAR-10 KNN准确率: {acc_c:.3f}\")"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MNIST KNN准确率: 0.816\n",
      "CIFAR-10 KNN准确率: 0.236\n"
     ]
    }
   ],
   "execution_count": 4
  },
  {
   "cell_type": "markdown",
   "id": "e4c9b45c",
   "metadata": {},
   "source": [
    "## 可视化分析"
   ]
  },
  {
   "cell_type": "code",
   "id": "bcf134de",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-22T14:40:43.522251Z",
     "start_time": "2025-05-22T14:40:43.325307Z"
    }
   },
   "source": [
    "# 准确率柱状图\n",
    "plt.figure(figsize=(5,4))\n",
    "plt.bar(['MNIST', 'CIFAR-10'], [acc_m, acc_c])\n",
    "plt.ylabel('Accuracy')\n",
    "plt.title('KNN在不同数据集上的准确率')\n",
    "plt.show()\n",
    "# 混淆矩阵\n",
    "fig, axes = plt.subplots(1,2, figsize=(12,5))\n",
    "axes[0].imshow(cm_m, cmap=plt.cm.Blues)\n",
    "axes[0].set_title('MNIST 混淆矩阵')\n",
    "axes[1].imshow(cm_c, cmap=plt.cm.Blues)\n",
    "axes[1].set_title('CIFAR-10 混淆矩阵')\n",
    "for ax in axes:\n",
    "    ax.set_xlabel('Predicted')\n",
    "    ax.set_ylabel('True')\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ],
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\machineLearning\\venv\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 22312 (\\N{CJK UNIFIED IDEOGRAPH-5728}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\machineLearning\\venv\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 19981 (\\N{CJK UNIFIED IDEOGRAPH-4E0D}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\machineLearning\\venv\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 21516 (\\N{CJK UNIFIED IDEOGRAPH-540C}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\machineLearning\\venv\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 25968 (\\N{CJK UNIFIED IDEOGRAPH-6570}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\machineLearning\\venv\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 25454 (\\N{CJK UNIFIED IDEOGRAPH-636E}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\machineLearning\\venv\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 38598 (\\N{CJK UNIFIED IDEOGRAPH-96C6}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\machineLearning\\venv\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 19978 (\\N{CJK UNIFIED IDEOGRAPH-4E0A}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\machineLearning\\venv\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 30340 (\\N{CJK UNIFIED IDEOGRAPH-7684}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\machineLearning\\venv\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 20934 (\\N{CJK UNIFIED IDEOGRAPH-51C6}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\machineLearning\\venv\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 30830 (\\N{CJK UNIFIED IDEOGRAPH-786E}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\machineLearning\\venv\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 29575 (\\N{CJK UNIFIED IDEOGRAPH-7387}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 500x400 with 1 Axes>"
      ],
      "image/png": "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/D9+H9zH1pLsFYN5/Pz8JCoqSgoKClq0+PQ8Li7O5T16vXl59eabb7ZZHgCAznB716t2iyYnJ0t0dLTExMRIdna21NbWmlGwKikpSUJDQ82zRnXjjTfKySefLA8++KBMmTJFVqxYIR999JEsXrzYzd8JAMATuT0oExMTpbKyUjIyMsyAnMjISMnPz3cO2CktLTUjYR2OP/54ee655+TOO++U22+/XQ499FAz4vWoo45y43eB9tJucJ0z+9vucMAb8fvQN/g07W1cLAAAXsztCw4AANCbEZQAAFgQlAAAWBCUAABYEJTYq0svvdSsYnTVVVe1+ty1115rPqdlmpedM2dOi3I6Mrn5Skhr1qwx5zt27HBeW7Jkidk9ZvDgwWZRiAkTJjinBek2bFq+rcPx9YHO0tH3119/vYwePdqMRtWVc8455xzn/G39WdRpbA6ufjYPOuigVutR6+IqH374Yauv5/id0aN///5y8MEHy6233io///yztZ7vvvuuqZeuKqP3ulrvWsdq6oyCAw88UAYMGGDW0f7666878b/jnQhKtIv+sdA5qz/99JPzmv4i61Sd3/3udy3K6j6hc+fOlR9//LHdr6+7xdx0001yww03yPr16+U///mP+WOxa9cu83n9A/P999+b4+WXXzbXNm7c6Lymu8oAnbV582azCMrbb78t8+fPl88++8xMVzv11FPNm8K23Hvvvc6fRT10C0AHneKm2wNed911be6KpDsi6X3ffvutPPTQQ/L444+baSM2Ot9c31jqfr5tmTdvnjz88MNmV6YPPvhABg0aZEJ7byGMXjaPEn2DbmX2zTffyMqVK2XmzJnmmn6sIanvgJvTd62bNm0yrUH9RW2P1157TS666CKzz6jDkUce6fz4gAMOcH48fPhw8+/IkSNZjhBd6pprrjGtM908XkOl+c/iZZdd1uZ9Q4YMaXMZzSeffFLOPvtsufrqq+W4444zWwtq6645bbk67tc3pfo7pCuO6RvOtpx55pnmaIu2JrXlq3POzz33XHPtb3/7m5mjrq3P6dOnW/4n0BwtSrSb/qHQX3oHfXfsWEGpOe1ieuCBB+SRRx6RrVu3tuu19Y/E+++/L999912X1hloL90sQVuP2nJsHpIO+/KmTMNKf2cuvvhiGTt2rIwZM0Zeeukl6z26Cb22QHWJz8743//+Z7qRNXSbr2saGxvb5jaGcI2gRLvpL/vatWtNmOmh3aN6zZXzzjvPrLK0t+4jBy2nf4j0ec/hhx9untu88MILZu1foCdoL4gGmwZaR912223m2brj0O5O9dZbb8nu3btNd6fS35elS5e2uv/111839+lji3HjxklFRYXZnL4zHFsPdmRbQrhGUKLdtPtT19ddvny5eZesH+sOMG3RbqOnnnpKvvrqq72+tg420He5+kxI1/P95ZdfzBrA+uyGsERP6MwiZRpq+mzdcega1Y5eF12mc7/9/v8p14wZM8wbTH2M0Zw+A9X79Dmi/txrT835559vPvfee++1COFnn322U98nOo6gRIe7XzUoNQBtz2zUxIkTzTtp3RO0vXTNXn1O9Mwzz5hnNHq88847XVBzwE7Xjdbnk21tGm+jbxi1W9VxaO+IduW+8sor8thjj5mg1EM3eNA3gb8d1KNdvXqfDs7Rz2lgOlqeumFE8xCeOnVqu+rkeObZkW0J4RpBiQ7RFl59fb3s2bPH2Z1ko9NE/vGPf+zTM5GIiAjn6D6gu+kgMf2Z1lGkrn7mmk9lag9t+ek0kU8++aRF0OnOR/pms6GhweV9ugmEbvigg3B0lLkO/GkewjpwqD10kJ0GYvNtCXWjaA1htiXsGIISHaIDdbQr9csvvzQf740+b9FRso5nNm3REYGzZ8823VL6/FMH9mj3lXb38kuNnqIhqQGmW/7pNCSdc6g/7/rz29GfQ20RXnDBBaaXpPmhI7urqqrMwKG2XHjhheb3yzb1Q6dOOcLXMXhHP9bpKEpbxzrl6r777jOjyvWxhv5O6bzLadOmdeh78XYEJbp9N3adY7a354w6Mk/DUf9AHHbYYeb5jA5s0HfDI0aM6IJaA3uniwyUlJSYZ4a33HKLCbZJkyaZn8NFixa1+3WKi4tNS9LxnLE5HXl6+umnuxzU46DdtDrvUqdXtdWjovvw6qIcejj29tWPdYEBB52LrIsnXHnllXLssceacNWA1t8ttB/bbAEAYEGLEgAAC4ISAAALghIAAAuCEgAAC4ISAAALghIAAAuCEgAAC4ISAAALghIAAAuCEgAAC4ISAAALghIAAGnb/wHwSjvXelmB5wAAAABJRU5ErkJggg=="
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\13306\\AppData\\Local\\Temp\\ipykernel_25332\\241295519.py:16: UserWarning: Glyph 28151 (\\N{CJK UNIFIED IDEOGRAPH-6DF7}) missing from font(s) DejaVu Sans.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\13306\\AppData\\Local\\Temp\\ipykernel_25332\\241295519.py:16: UserWarning: Glyph 28102 (\\N{CJK UNIFIED IDEOGRAPH-6DC6}) missing from font(s) DejaVu Sans.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\13306\\AppData\\Local\\Temp\\ipykernel_25332\\241295519.py:16: UserWarning: Glyph 30697 (\\N{CJK UNIFIED IDEOGRAPH-77E9}) missing from font(s) DejaVu Sans.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\13306\\AppData\\Local\\Temp\\ipykernel_25332\\241295519.py:16: UserWarning: Glyph 38453 (\\N{CJK UNIFIED IDEOGRAPH-9635}) missing from font(s) DejaVu Sans.\n",
      "  plt.tight_layout()\n",
      "D:\\machineLearning\\venv\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 28151 (\\N{CJK UNIFIED IDEOGRAPH-6DF7}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\machineLearning\\venv\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 28102 (\\N{CJK UNIFIED IDEOGRAPH-6DC6}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\machineLearning\\venv\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 30697 (\\N{CJK UNIFIED IDEOGRAPH-77E9}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\machineLearning\\venv\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 38453 (\\N{CJK UNIFIED IDEOGRAPH-9635}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1200x500 with 2 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABBUAAAHqCAYAAABbfXZsAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAL0BJREFUeJzt3QmUXVWZP+y3kkoqcwxzImEUCDFhHsTYAVoEFBFEURQ0gNIIgQQQhMhChgABWxQEGZupkVFpBFHko5kRkCFIg40gIhJmEEglBCpD1bf2aav+KZKQql1Jzrmp51nrkNx7z733zVnFPW/97t771LW0tLQEAAAAQCf16OwTAAAAABKhAgAAAJBFqAAAAABkESoAAAAAWYQKAAAAQBahAgAAAJBFqAAAAABkESoAAAAAWYQKAAAAQBahAgAAAJBFqAAdcNlll0VdXV2x3XfffQs83tLSEsOHDy8e//znP9/usdbnnXHGGYt83UceeaTtvhNOOKG4780332y3769//evYdtttY5VVVol+/frFOuusE1/5ylfid7/7XfH4dttt1/ZeH7al1wcA+DB//etf48ADDyz6jT59+sSgQYNizJgxcdZZZ8V7773Xtt9aa621yN7ng9tqq63Wbr933nmneO302FNPPbXQOvbdd992r9HQ0BDrr79+/OAHP4j333+/Q/+Whx56KA4++ODYfPPNo1evXsXrfJiLL744Ntxww6K29dZbL84+++wOvQ90V/VlFwC1JJ1crrrqqvjUpz7V7v677747XnzxxeJEtyj//u//HgcddFARCHTWj370ozjqqKOKUGHSpEnFazz77LPx3//933HNNdfEzjvvHMcee2x8+9vfbnvOww8/HD/96U/j+9//fnFibLXRRhst9D3OPffcOOKII6K+fuEfCyuttFI8//zzpe0HACwbv/nNb2LPPfcs+ppvfvObMWrUqJg9e3bxxUrqR/70pz/FhRde+KGv8ZnPfKZ47vz69u3b7vYvfvGLtrDhyiuvjJNPPnmhr5Xq+I//+I/i79OnT48bb7wxJk+eXAQf6XmL89vf/rZ4fuqBUkjyzDPPLHLfCy64IL7zne/El770paI/uffee2PChAkxa9asOProoxf5vHRMNt100+jdu/dCH0/HLwUnKQgpY7911113kbVDl7UAi3XppZe2pP9d9thjj5aVVlqp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ALIIFQAAAIAsQgUAAAAgi1ABAAAAyCJUAAAAALIIFQAAAIAsQgUAAAAgi1ABAAAAyFIfNaylpaX4c0ZjY9ml0M3NmDk7qqy+uXfZJdS892bPK7uEmjf3/XejFuprPbdALWr9+W2aNTOqqrEG+raZM6r9edXYo9p9RzJr5oyossbGflF1M2a8F1XW2HNOVN3sCn8WJjNnVPvzcOY//z9eXG9U11LD3dOLL74Yw4cPL7sMAJYj06ZNi9VXX73sMiCL3giAZd0b1XSo0NzcHC+//HIMHDgw6urqlkhynk7E6aANGjRoidTY3TiGXecYdp1j2HXd8Rim0+GMGTNi2LBh0aOH2YHUJr1R9TiGXecYdp1j2HXd8Ri2dLA3qunpD+kftjS+TUo/JN3lB2VpcQy7zjHsOsew67rbMRw8eHDZJUCX6I2qyzHsOsew6xzDrutux3BwB3ojX8UAAAAAWYQKAAAAQBahwnwaGhri+OOPL/4kj2PYdY5h1zmGXecYAonPgq5zDLvOMew6x7DrHMNYPhdqBAAAAMpjpAIAAACQRagAAAAAZBEqAAAAAFmECvP52c9+FmuttVb06dMntt5663jooYfKLqlmTJkyJbbccssYOHBgrLLKKrH77rvH008/XXZZNeu0006Lurq6OOyww8oupea89NJLsc8++8SKK64Yffv2jdGjR8cjjzxSdlk1Yd68eXHcccfF2muvXRy7ddddNyZPnhyW3oHuS2+UT2+05OmP8uiNukZ/tHhChX+69tpr44gjjihW9Jw6dWpsvPHGsdNOO8Xrr79edmk14e67747x48fHgw8+GLfddlvMmTMndtxxx3j33XfLLq3mPPzww3HBBRfERhttVHYpNeftt9+OMWPGRK9eveKWW26J//3f/40zzjgjhgwZUnZpNeH000+P8847L84555x46qmnits//OEP4+yzzy67NKAEeqOu0RstWfqjPHqjrtMfLZ6rP/xTSt9Tmpx+WJLm5uYYPnx4HHrooXHMMceUXV7NeeONN4pUPp1Qx44dW3Y5NWPmzJmx2Wabxbnnnhsnn3xybLLJJnHmmWeWXVbNSP+v/v73v49777237FJq0uc///lYddVV4+KLL26770tf+lKRyv/85z8vtTZg2dMbLVl6o3z6o3x6o67THy2ekQoRMXv27Hj00Udjhx12aLuvR48exe0HHnig1Npq1fTp04s/V1hhhbJLqSnpG41ddtml3c8iHXfTTTfFFltsEXvuuWfRuG266aZx0UUXlV1WzfjkJz8Zt99+ezzzzDPF7ccffzzuu++++OxnP1t2acAypjda8vRG+fRH+fRGXac/Wrz6Duyz3HvzzTeLuTIpgZpfuv3nP/+5tLpqVfomI811S0OtRo0aVXY5NeOaa64phpem4X3kee6554rhaWm47ve///3iWE6YMCF69+4d48aNK7u8mvg2o7GxMUaMGBE9e/YsPhdPOeWU2HvvvcsuDVjG9EZLlt4on/6oa/RGXac/WjyhAkslTX7yySeLBI+OmTZtWkycOLGYc5kWwyK/aUtp/KmnnlrcTml8+lk8//zznTg74Lrrrosrr7wyrrrqqvj4xz8ef/zjH4smeNiwYY4fQBfojfLoj7pOb9R1+qPFEypExEorrVSkTq+99lq7+9Pt1VZbrbS6atEhhxwSN998c9xzzz2x+uqrl11OzUhDTNPCV2m+YKuUgqbjmOayNjU1FT+jfLihQ4fGyJEj29234YYbxvXXX19aTbXkqKOOKtL4vfbaq7idVof++9//Xqxg7qQJ3YveaMnRG+XTH3Wd3qjr9EeLZ02FiGL4z+abb17MlZk/1Uu3t9lmm1JrqxVpvc900rzhhhvijjvuKC65Qsd9+tOfjieeeKJIPlu3lCqnYVXp706YHZOGlX7wcl1p/tuaa65ZWk21ZNasWcWc6fmln730eQh0L3qjrtMbdZ3+qOv0Rl2nP1o8IxX+Kc0zSklT+qDaaqutihVl0yV/9ttvv7JLq5lhfWlI0I033lhcj/nVV18t7h88eHCxMiofLh2zD86x7N+/f3E9YXMvO+7www8vFtNJQ/y+8pWvFNdTv/DCC4uNxdt1112LOYJrrLFGMbzvscceix//+Mex//77l10aUAK9UdfojbpOf9R1eqOu0x91QLqkJP/n7LPPblljjTVaevfu3bLVVlu1PPjgg2WXVDPSj9LCtksvvbTs0mrWtttu2zJx4sSyy6g5v/71r1tGjRrV0tDQ0DJixIiWCy+8sOySakZjY2PxM5c+B/v06dOyzjrrtBx77LEtTU1NZZcGlERvlE9vtHTojzpPb9Q1+qPFq0v/6Uj4AAAAADA/ayoAAAAAWYQKAAAAQBahAgAAAJBFqAAAAABkESoAAAAAWYQKAAAAQBahAgAAAJBFqAAAAABkESrAcmbfffeN3Xffve32dtttF4cddtgyr+Ouu+6Kurq6eOedd5b5ewMAtNIbwdIlVIBleEJLJ5K09e7dOz72sY/FSSedFHPnzl2q7/tf//VfMXny5A7t62QHACwreiNYPtSXXQB0JzvvvHNceuml0dTUFL/97W9j/Pjx0atXr5g0aVK7/WbPnl2cXJeEFVZYYYm8DgDAkqY3gtpnpAIsQw0NDbHaaqvFmmuuGQcddFDssMMOcdNNN7UNyzvllFNi2LBhscEGGxT7T5s2Lb7yla/ERz7ykeIEuNtuu8Xzzz/f9nrz5s2LI444onh8xRVXjO9973vR0tLS7j0/OMQvnbSPPvroGD58eFFP+lbg4osvLl53++23L/YZMmRIkcqnupLm5uaYMmVKrL322tG3b9/YeOON45e//GW790mNwPrrr188nl5n/joBABZGbwS1T6gAJUonmZS8J7fffns8/fTTcdttt8XNN98cc+bMiZ122ikGDhwY9957b/z+97+PAQMGFIl+63POOOOMuOyyy+KSSy6J++67L95666244YYbPvQ9v/nNb8bVV18dP/3pT+Opp56KCy64oHjddCK9/vrri31SHa+88kqcddZZxe100vzP//zPOP/88+NPf/pTHH744bHPPvvE3Xff3XaC32OPPWLXXXeNP/7xj/Htb387jjnmmKV89ACA5Y3eCGpQC7BMjBs3rmW33XYr/t7c3Nxy2223tTQ0NLQceeSRxWOrrrpqS1NTU9v+V1xxRcsGG2xQ7NsqPd63b9+WW2+9tbg9dOjQlh/+8Idtj8+ZM6dl9dVXb3ufZNttt22ZOHFi8fenn346RfXFey/MnXfeWTz+9ttvt933/vvvt/Tr16/l/vvvb7fvt771rZavfe1rxd8nTZrUMnLkyHaPH3300Qu8FgBAK70RLB+sqQDLUErZU/KdkvY0bO7rX/96nHDCCcX8wdGjR7ebK/j444/Hs88+W6Tx83v//ffjr3/9a0yfPr1IzLfeeuu2x+rr62OLLbZYYJhfq5SU9+zZM7bddtsO15xqmDVrVnzmM59pd3/6RmDTTTct/p5S/fnrSLbZZpsOvwcA0D3pjaD2CRVgGUrz6c4777ziBJnmB6YTXav+/fu323fmzJmx+eabx5VXXrnA66y88srZQwo7K9WR/OY3v4mPfvSj7R5L8w4BAHLpjaD2CRVgGUonx7T4T0dsttlmce2118Yqq6wSgwYNWug+Q4cOjT/84Q8xduzY4na6BNOjjz5aPHdhUuKfvgVI8/3SQkgf1PptQFrkqNXIkSOLE+QLL7ywyBR/ww03LBZVmt+DDz7YoX8nANB96Y2g9lmoESpq7733jpVWWqlY1TgtRvS3v/2tuFbyhAkT4sUXXyz2mThxYpx22mnxq1/9Kv785z/HwQcf/KHXUV5rrbVi3Lhxsf/++xfPaX3N6667rng8rbycVjZOQxHfeOONIolPQwyPPPLIYgGiyy+/vBheOHXq1Dj77LOL28l3vvOd+Mtf/hJHHXVUsZDRVVddVSySBACwpOiNoJqEClBR/fr1i3vuuSfWWGONYvXglHh/61vfKuYNtqbz3/3ud+Mb3/hGcTJM8/TSSe6LX/zih75uGmL45S9/uTjJjhgxIg444IB49913i8fSEL4TTzyxWJ141VVXjUMOOaS4f/LkyXHccccVKx2nOtIqy2nIX7qMUpJqTKsjp5NxuqRSWgn51FNPXerHCADoPvRGUE11abXGsosAAAAAao+RCgAAAEAWoQIAAACQRagAAAAAZBEqAAAAAFmECgAAAEAWoQIAAACQRagAAAAAZBEqAAAAAFmECgAAAEAWoQIAAACQRagAAAAAZBEqAAAAAJHj/wfQkDHOQ+HXYAAAAABJRU5ErkJggg=="
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 5
  }
 ],
 "metadata": {
  "language_info": {
   "name": "python"
  },
  "kernelspec": {
   "name": "python3",
   "language": "python",
   "display_name": "Python 3 (ipykernel)"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
